package com.richpay.basejava.base08;
/**
 * 成员变量在什么时候需要静态化？当这个成员变量值在所有的对象中都相同时可以将这个变量静态化，让所有对象共享
 * 这个变量，避免每次实例化对象都初始化一份相同的数据。如:都是中国人
 *
 *
 *
 *
 *
 * 实例方法可以访问实例变量和方法。
 * 静态方法可以访问静态变量和静态方法。
 *
 * 静态的东西(静态变量和静态方法)在类被加载时就已经存在了。
 * 实例的东西(实例变量和实例方法)在用户实例化对象时才存在。
 *
 * 如果用户没有实例化对象，则实例变量和实例方法都不存在。
 * 总上所述，静态的东西存在的时间肯定比实例的东西存在的时间早。
 *
 *
 * 实例方法可以访问静态变量和静态方法，为什么？
 * 因为在实例方法已经存在的情况下，静态变量和静态方法一定存在了。
 *
 * 静态方法不能访问实例变量和实例方法，为什么？
 * 因为静态的东西存在不需要实例化对象，有可能存在这种情况，
 * 用户没有实例化任何对象的情况下，实例的东西是不存在的，
 * 静态的东西调用实例的东西可能会出现访问根本不存在的东西，非法。
 */
public class Person {
    private String name;
    private int age;
    private static int count;//统计用户共实例化了多少对象。私有的外部不可修改
    static String nationality="中国";//国籍

    public Person(String name,int age){
        this.name=name;
        this.age=age;
        count++;
    }

    /**
     * 静态方法 show()
     */
    public static void show(){
        /**
         *Person.java:20: 错误: 无法从静态上下文中引用非静态 变量 name
         *  name="show";
         *
         *  1 个错误
         */
        //name="show"; //报如上错误



        System.out.println("count="+count);//静态方法可以访问静态变量。

        /**
         * Person.java:23: 错误: 无法从静态上下文中引用非静态 方法 display()
         *         display();
         *         ^
         * 1 个错误
         *
         */
       // display(); 报错
    }

    /**
     * 实例方法 可访问静态变量和静态方法
     */
    public void display(){
        show();
        System.out.println("name="+name+",age="+age+",nationality="+nationality+",count="+count);
    }

    /**
     * 静态代码块在类被加载时自动调用，而且只调用一次
     * 主要完成静态变量的初始化
     *
     * 静态代码块的执行顺序就是它在文件中的书写顺序.
     */


    static{
        nationality="美国";
        System.out.println("===静态代码块一调用了===");
    }

    static{
        nationality="俄国";//这个起了作用
        System.out.println("===静态代码块二调用了===");
    }
}
